import 'package:dio/dio.dart';
import 'package:wan_android_flutter/http/http_method.dart';
import 'package:wan_android_flutter/http/print_log_interceptor.dart';
import 'package:wan_android_flutter/http/rsp_interceptor.dart';

import 'cookie_intercepter.dart';

class DioInstance {
  // 单例模式，确保只有一个DioInstance实例
  static DioInstance? _instance; // 使用私有变量存储单例实例
  DioInstance._(); // 私有构造函数，防止外部创建实例

  // 获取单例实例的静态方法
  static DioInstance instance() {
    return _instance ??= DioInstance._(); // 如果_instance为空，则创建一个新的实例
  }

  // 创建Dio实例
  final Dio _dio = Dio();

  // 默认超时时间为30秒
  final _defaultTime = const Duration(seconds: 30);

  // 初始化Dio配置
  void initDio({
    required String baseUrl, // 必填参数，基础URL
    String? httpMethod = HttpMethod.GET, // 请求方法，默认为GET
    Duration? connectTimeout, // 连接超时时间
    Duration? receiveTimeout, // 接收数据超时时间
    Duration? sendTimeout, // 发送数据超时时间
    ResponseType? responseType = ResponseType.json, // 响应类型，默认为JSON
    String? contentType, // 内容类型
  }) {
    // 配置Dio的BaseOptions
    _dio.options = BaseOptions(
      method: httpMethod,
      // 设置请求方法
      baseUrl: baseUrl ?? "",
      // 设置基础URL
      connectTimeout: connectTimeout ?? _defaultTime,
      // 设置连接超时时间
      receiveTimeout: receiveTimeout ?? _defaultTime,
      // 设置接收数据超时时间
      sendTimeout: sendTimeout ?? _defaultTime,
      // 设置发送数据超时时间
      responseType: responseType,
      // 设置响应类型
      contentType: contentType, // 设置内容类型
    );

    //添加cookie拦截器
    _dio.interceptors.add(CookieInterceptor());
    // 添加打印请求和响应信息的拦截器
    _dio.interceptors.add(PrintLogInterceptor());
    // 添加统一处理响应数据的拦截器
    _dio.interceptors.add(ResponseInterceptor());
  }

  /// GET请求方法
  Future<Response> get({
    required String path, // 请求路径
    Map<String, dynamic>? param, // 请求参数
    Options? options, // 请求选项
    CancelToken? cancelToken, // 取消请求的Token
  }) async {
    return _dio.get(
      path,
      queryParameters: param, // 设置查询参数
      options: options ??
          Options(
            method: HttpMethod.GET, // 设置请求方法为GET
            receiveTimeout: _defaultTime, // 设置接收数据超时时间
            sendTimeout: _defaultTime, // 设置发送数据超时时间
          ),
      cancelToken: cancelToken, // 设置取消请求的Token
    );
  }

  /// POST请求方法
  Future<Response> post({
    required String path, // 请求路径
    Object? data, // 请求体数据
    Map<String, dynamic>? queryParameters, // 查询参数
    Options? options, // 请求选项
    CancelToken? cancelToken, // 取消请求的Token
  }) async {
    return _dio.post(
      path,
      data: data, // 设置请求体数据
      queryParameters: queryParameters, // 设置查询参数
      cancelToken: cancelToken, // 设置取消请求的Token
      options: options ??
          Options(
            method: HttpMethod.POST, // 设置请求方法为POST
            receiveTimeout: _defaultTime, // 设置接收数据超时时间
            sendTimeout: _defaultTime, // 设置发送数据超时时间
          ),
    );
  }
}
